![Amazon Lexのスロットを理解する](https://devio2023-media.developers.io/wp-content/uploads/2017/01/eyecatch-lex.png)
Amazon Lexのスロットを理解する
渡辺です。
ボットを含め、ユーザインターフェイスでは、処理に必要な情報(パラメータ)をユーザから収集する必要があります。
例えば、予約チャットボットでは、ユーザの希望する予約日と予約時間を情報として収集しなければなりません。 商品問い合わせボットでは、ユーザの求める商品名を収集します。 このように、ボットはユーザから幾つかの情報を収集し、それを元に処理を行い、適切な応答を返すのが基本です。
Lexでは、このような情報をスロットと呼ばれる仕組みを使うことで、簡単に収集できます。
インテントとスロット
インテントは、ユーザの目的を表し、0個以上のスロットを追加できます。 例えば、予約ボットの「予約インテント(Reservation)」は、ユーザの予約を受けるインテントです。 そして、予約日と予約時間をスロットとして追加します。 これは、「予約」という目的を達成するために、「予約日」と「予約時間」が必要な情報(パラメータ)ということです(厳密には、必須でないパラメータも設定できる)。
Lexでは、インテントにスロットを登録した場合、ユーザから必要な情報を得るまでのやりとりを、Lexに任せることができます。 言い換えれば、応答時の処理は、必要な情報が揃ったという前提で実装できます。
インテントのサンプル発話を決定する
予約インテントは、ユーザの予約を受けるインテントです。 ユーザが「予約したい」と臭わせる発話をサンプル発話に登録することで、Lexは「予約モード」となります。 例えば、「I want reservation.」「I want to see you.」と発言すると、予約日と予約時間を確認し、予約が行われるといった流れになります。
Lexは、予約モードとなれば、登録されているスロットを埋めるために自動応答を行います。
スロットタイプ
インテントにスロットを追加する時、スロットタイプを選択します。
スロットタイプには、あらかじめ提供されている組み込みスロットタイプと、自ら定義するカスタムスロットタイプがあります。
組み込みスロットタイプには、日付に対応するAMAZON.DATE
、時間に対応するAMAZON.TIME
などがあります。
組み込みスロットタイプを利用するメリットは、よくある言い回しはカバーされていることです。
例えば、AMAZON.DATE
スロットタイプでは、もちろん「1月20日」といった具体的な日付けを認識しますが、「明日(tommorow)」といった言い回しも、今日の日付から計算してパラメータに設定されます。
カスタムスロットタイプを作成する場合、ユーザが良いそうな言い回しをシノニムとして登録しなければならないため、利用可能であれば組み込みスロットタイプを利用する方が良いでしょう。
プロンプト
スロットのプロンプトには、Lexがユーザに入力を促すための台詞を登録します。 例えば、予約日が入力されていない場合、「What day do you want to reserve?」と応答し、ユーザに予約日の入力を促します。 同様に、予約時間のプロンプトは、例えば「At what time do you want to reserve?」と設定します。
インテントの設定
スロットの仕組みが判ったところで、実際に予約インテントを作成してみましょう。 2018年1月時点では、日本語には対応していないため、USリージョンで英語ボットを作成します(Appointment)。
インテント「Reservation」を作成したならば、サンプル発話に「I want reservation.」「I want to see you.」と設定します。
Dateスロットには、スロットタイプAMAZON.DATE
で、プロンプトを「What day do you want to reserve?」としました。
Timeスロットには、スロットタイプAMAZON.TIME
で、プロンプトを「At what time do you want to reserve?」としました。
それぞれ、Required(必須)にチェックを入れておきます。
動作確認
ビルドしたならば、チャットウィンドウで動作確認してみましょう。
「I want to see you.」と発言すると、予約インテントが起動します。 スロットにはまだ何も登録されていないため、Lexはスロットを埋めるため、プロンプトを表示します。
予約日として「tommorow」と入力すると、当日(1/11)の翌日である1/12がスロットに登録されました。 予約時間がまだ未入力なので、プロンプトが表示されます。
時間を入力すると、すべてのスロットが埋まりました。
スロットがすべて埋まった後に、Lambda関数がフックされます。 Lambda関数は、予約日と予約時間が既に埋まっている状態で呼び出されるため、非常に簡単なコードで予約処理が実装できるでしょう。
次のステップへ
今回は、スロットを理解するため、シンプルなスロットを作成しました。 しかし、実用的なボットとするにはこれでは不十分です。 例えば、定休日や夜間など予約不可能日時があるかもしれません。 そのような場合、ValidationのコードをLambdaで実装します。 また、確認(Confirm)も必要なケースもあるでしょう。 はじめから「明日、予約したいんだ」と入力されるかもしれません。
次回は応用編ということで、様々な機能を使ってみようと思います。 なお、このスロットという仕組みはAlexaでも採用されています。